package com.itheima.sharding.alg;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.Collection;

/**
 * 定义精准查询库的算法类
 * 接口中的泛型类型与分片键的类型一致 （user_id -->bigint -->long）
 * 定义当sql分片键使用 = 或者 in 的时候，会调用该方法
 */
public class MyPreciseShardingAlgorithm4Db implements PreciseShardingAlgorithm<Long> {
    /**
     * 实现分库的算法
     * @param collection 一切配置中可用的数据源集合：ds1,ds2    从这里获得[ds$->{1..2}.t_order_$->{1..2}]
     * @param preciseShardingValue 数据库对应分片键的值 ---> user_id
     * @return 返回一个具体的数据源名称
     */
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {

        //获取逻辑表名称
        String logicTableName = preciseShardingValue.getLogicTableName();

        //1.获取分片键名称-->即数据库中列的名称 user_id
        String columnName = preciseShardingValue.getColumnName();

        //2.获取分片键的值
        Long value = preciseShardingValue.getValue();

        //3.根据分片键的值，计算出对应的数据源名称
        //   3.1 先计算出分片键的值对应的模数
        Long mod = value % 2 + 1;
        //   3.2 根据模数，从数据源集合中获取对应的数据源名称
        String dataSourceName = collection.stream().filter(dsName -> dsName.endsWith(mod+"")).findFirst().get();

        return dataSourceName;
    }
}
